//https://leetcode.cn/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/description/
//将二叉排序树转化为排序的双向链表
//将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。
//对于双向循环列表，你可以将左右孩子指针作为双向循环链表的前驱和后继指针，第一个节点的前驱是最后一个节点，最后一个节点的后继是第一个节点。
//特别地，我们希望可以 就地 完成转换操作。当转化完成以后，树中节点的左指针需要指向前驱，树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;

    Node() {}

    Node(int _val) {
        val = _val;
        left = NULL;
        right = NULL;
    }

    Node(int _val, Node* _left, Node* _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
public:

    void InOrderPush(Node* root)
    {
        if(root == nullptr)
            return;

        InOrderPush(root->left);
        st.push(root);
        InOrderPush(root->right);
    }

    Node* treeToDoublyList(Node* root) {
        if(root == nullptr)
            return nullptr;
            
        InOrderPush(root);

        Node* end = st.top();
        st.pop();
        Node* cur, *pre = end;
        while(!st.empty())
        {
            cur = pre;
            pre = st.top();
            st.pop();

            pre->right = cur;
            cur->left = pre;
        }

        pre->left = end;
        end->right = pre;

        return pre;
    }

    stack<Node*> st;
};